/**
 * Created with IntelliJ IDEA.
 * Description: 数组实现循环队列
 * User: liangyuanzhang
 * Date: 2025-3-30
 * Time: 12:24
 */

/*
数组实现循环队列
浪费一个空间
判断下一个是否为相遇为front
 */
public class MyCircularQueue {
    public int front = 0;
    public int rear = 0;
    public int[] elem;

    public MyCircularQueue(int k) {
        elem = new int[k+1]; // 因为浪费一个空间 根据题目要求这里直接+1就可以
    }

    public boolean enQueue(int value) { // 入队列
        if(isFull()){ // 如果满了不能
            return false;
        }
        elem[rear] = value;
        rear = (rear+1)%elem.length;
        return true;
    }

    public boolean deQueue() { // 出队列
        if(isEmpty()){
            return false;
        }
        front = (front+1)%elem.length; // 因为现在是数组删除元素(出队列),所以直接让front往后走就行,因为循环到时候front原来的元素会被rear覆盖
        return true;
    }

    public int Front() { // 得到队头元素 (在队列里面队头是发负责出队的) ==> 尾进头出(先进先出)
        if(isEmpty()){
            return -1;
        }
        return elem[front];
    }

    public int Rear() { // 得到队尾元素
        if(isEmpty()){
            return -1;
        }
        int index = (rear == 0) ? elem.length-1 : rear-1; // 别忽略了rear在0位置的时候如果这时-1就会越界
        return elem[index];
    }

    public boolean isEmpty() {
        return front == rear;
    }

    public boolean isFull() {
        return (rear+1)%elem.length == front; // 浪费一个空间，然后判断rear的下一个等不等于front
    }
}
